package com.gec.system.controller;

import com.gec.model.entity.SysUser;
import com.gec.model.vo.LoginVo;
import com.gec.system.exception.MyCustomerException;
import com.gec.system.service.SysUserService;
import com.gec.system.util.JwtHelper;
import com.gec.system.util.MD5Helper;
import com.gec.system.util.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@RestController
@Api(tags = "登录管理控制器")
@RequestMapping(value = "/admin/system/index")
public class LoginController {


    @Autowired
    private SysUserService sysUserService;

    @Autowired
    private RedisTemplate redisTemplate;


    @ApiOperation("登录接口")
    @PostMapping("/login")
    public Result login(@RequestBody LoginVo loginVo) {
        System.out.println("1:"+loginVo.getUsername());
//      1、根据username查询数据
        SysUser sysUser = this.sysUserService.getUserInfoUserName(loginVo.getUsername());

        //2.如果查询为空 给出提示
        if (sysUser==null){
            throw  new MyCustomerException(20001,"用户不存在..");
        }

        //3.比较密码  （使用用户输入的密码和数据库密码比较）
        String password = loginVo.getPassword();//前端用户输入的密码
        String passwordwithMD5 = MD5Helper.encrypt(password);//前端密码加密
        //sysUser.getPassword() 数据库密码
        if (!sysUser.getPassword().equals(passwordwithMD5)){
            throw new MyCustomerException(20001,"密码不正确");
        }

        //4.判断用户是否可用
        if (sysUser.getStatus().intValue()==0){
            throw new MyCustomerException(20001,"账号被停用..");
        }

        //5.根据userid和username 生成token字符串 再通过map返回
        //5.根据用户userid和username去生成token，再通过map封装后返回
        String token = JwtHelper.createToken(sysUser.getId()+"", sysUser.getUsername());
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("token", token);

        return Result.ok(map);

//        Map<String, Object> map = new HashMap<>();
//        // TODO  状态码 等下是放在前端处理，因为前端需要的是 20000 ，而我们的后端 返回的 默认是 200
//        //  map.put("code",20000);
//        map.put("token", "admin-token");
//        return Result.ok(map);
    }

    @ApiOperation("登录后获取用户信息")
    @GetMapping("/info")
    public Result info(HttpServletRequest request) {


        //a.获取请求头的 token 字符串
        String token = request.getHeader("token");

        //b.从token 字符串获取用户名称 (id)  这一步其实就是在校验jwt的token是否合法！！！
        String username = JwtHelper.getUsername(token);

        // c.根据用户名称获取用户信息 （a.基本信息  b.菜单权限信息  和 c.按钮权限信息）
        Map<String,Object> map =  sysUserService.getUserInfo(username);
        return Result.ok(map);


//        Map<String, Object> map = new HashMap<>();
//        // TODO  状态码 等下是放在前端处理，因为前端需要的是 20000 ，而我们的后端 返回的 默认是 200
//        map.put("roles","[admin]");
//        map.put("introduction","I am a super admin");
//        map.put("avatar","https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
//        map.put("name","admin liangxj hello!");
//        return Result.ok(map);

    }

    //退出登录
    @ApiOperation("退出登录")
    @PostMapping("/logout")
    public Result logout(HttpServletRequest request){
//        public Result logout(HttpServletRequest request){

//        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        // 使当前用户的 JWT   Token 失效
        // 将 Token 加入一个黑名单列表中
        // 获取当前用户的 Token
        String token = request.getHeader("token");


        String username = JwtHelper.getUsername(token);

//        redisTemplate.delete("user:permissions:" + username);
//        redisTemplate.delete(username);
//
//        // 清除 Redis 中与当前用户相关的权限缓存信息
//        String userId = request.getHeader("userId");
        if (username != null) {
            redisTemplate.delete(username);
        }
        redisTemplate.opsForValue().set("blacklist:" + token, "invalid");
        return Result.ok();
    }



}